<template>
  <Page> </Page>
</template>

<script>
/**
 * 本项目拿openId的逻辑：
 * 1: 前台与微信交互拿到code
 * 2: 前台将code传递给后台，后台与微信交互拿到openId
 */
export default {
  name: "getOpenId",
  data() {
    return {};
  },
  computed: {},
  created() {
    // 处理进入
    this.handlerEnter();
  },
  methods: {
    // 处理进入
    handlerEnter() {
      // 从url的查询参数中获取code值
      const code = this.getUrlParam("code");
      // 从缓存中获取查询code的标识
      const getCodeFlag = utils.session.getThenRemove("getCodeFlag");

      if (!code || !getCodeFlag) {
        // 没有code或者没有查询code的标识，重新获取code

        // 设置查询code的标识
        utils.session.set("getCodeFlag", true);

        // 回调地址
        const redirectUrl = encodeURIComponent(
          globalConfig.pageUrl +
            "#/global/getOpenId?" +
            this.objToQueryStr(this.$route.query)
        );
        // 微信authorize url
        const authorizeUrl =
          "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
          globalConfig.appId +
          "&redirect_uri=" +
          redirectUrl +
          "&response_type=code&scope=snsapi_base&state=getOpenId#wechat_redirect";

        // replace跳转
        window.location.replace(authorizeUrl);
      } else {
        // 有code，将code传递给后台，后台与微信交互拿到openId
        const params = {
          url: `${globalConfig.pageUrl}?code=${code}`
        };
        // http
        utils.http
          .post(interfaces.global.getOpenIdByCode, params)
          .then(res => {
            const openId = res.dataObj.openid;
            if (!openId) {
              utils.ui.tips({
                type: "error",
                msg: "openId获取失败"
              });
              return;
            }

            // 更新state中的openId
            this.$store.commit("user/setState", {
              attr: "openId",
              data: openId
            });

            // 回挂查询参数replace跳转
            this.$router.replace({
              name: this.$route.query.finishTo,
              query: this.$route.query
            });
          })
          .catch(() => {});
      }
    },
    // 获取url中的查询参数
    getUrlParam(name) {
      const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
      const r = window.location.search.substr(1).match(reg); //匹配目标参数
      if (r != null) return decodeURI(r[2]);
      return null; //返回参数值
    },
    // 对象转查询串
    objToQueryStr(obj) {
      let str = "";
      for (let param in obj) {
        // 查询参数值需再次encode，因为query里面存储的是decode后的值
        str += param + "=" + encodeURIComponent(obj[param]) + "&";
      }
      str = str.substring(0, str.length - 1);
      return str;
    }
  }
};
</script>

<style lang="scss" scoped></style>
